#include <string>

using namespace std;

constexpr size_t get_size() { return 128; }

int main()
{
    unsigned cnt = 42;          // 不是常量表达式
    constexpr unsigned sz = 42; // 常量表达式
    int arr[10];                // 含有 10 个整数的数组
    int *parr[sz];              // 含有 42 个整型指针的数组
    string bad[cnt];            // 错误：cnt 不是常量表达式
    string strs[get_size()];    // 当 get_size 是 constexpr 时正确，否则错误

    int a1[sz] = {0, 1, 2};             // 含有 3 个元素的数组，元素值分别是 0, 1, 2
    int a2[] = {0, 1, 2};               // 维度是 3 的数组
    int a3[5] = {0, 1, 2};              // 等价于 a3[] = {0, 1, 2, 0, 0}
    string a4[3] = {"hi", "bye"};       // 等价于 a4[] = {"hi", "bye", ""}
    // int a5[2] = {0, 1, 2};           // 错误：初始值过多

    char a6[] = {'C', '+', '+'};        // 列表初始化，没有空字符
    char a7[] = {'C', '+', '+', '\0'};  // 列表初始化，含有显式的空字符
    char a8[] = "C++";                  // 自动添加空字符到字符串结尾
    // const char a9[6] = "Daniel";     // 错误：没有空间可存放空字符！

    int a[] = {0, 1, 2};
    // int a10[] = a;                   // 错误：不能用一个数组初始化另一个数组
    // a2 = a;                          // 错误：不能把一个数组直接赋值给另一个数组

    int *ptrs[10];              // ptrs 是含有 10 个整型指针的数组
    // int &refs[10] = /* ? */; // 错误：不存在引用的数组
    int (*parray)[10] = &arr;   // parray 指向一个含有 10 个整数的数组
    int (&arrRef)[10] = arr;    // arrRef 引用一个含有 10 个整数的数组

    int *(&arry)[10] = ptrs;    // arry 引用一个含有 10 个整型指针的数组
}